package db;

import java.util.ArrayList;
import java.util.List;
import org.hibernate.Query;

public class Drinkki extends Item implements java.lang.Comparable {

	private int id;
	private String ohje;

	private Ajankohta ajankohta;
	private Makeus makeus;
	private Lasi lasi;
	private Lämpötila lämpötila;
	private Menetelmä menetelmä;

	public Drinkki() {}

	public Ajankohta getAjankohta() {
		return ajankohta;
	}

	public void setAjankohta(Ajankohta ajankohta) {
		this.ajankohta = ajankohta;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public Lasi getLasi() {
		return lasi;
	}

	public void setLasi(Lasi lasi) {
		this.lasi = lasi;
	}

	public Lämpötila getLämpötila() {
		return lämpötila;
	}

	public void setLämpötila(Lämpötila lämpötila) {
		this.lämpötila = lämpötila;
	}

	public Makeus getMakeus() {
		return makeus;
	}

	public void setMakeus(Makeus makeus) {
		this.makeus = makeus;
	}

	public Menetelmä getMenetelmä() {
		return menetelmä;
	}

	public void setMenetelmä(Menetelmä menetelmä) {
		this.menetelmä = menetelmä;
	}

	public String getOhje() {
		return ohje;
	}

	public void setOhje(String ohje) {
		this.ohje = ohje;
	}

	/**
	 * simple checker if this drink has that ingredient
	 */
	public boolean hasAinesosa(Ainesosa ainesosa) {
		Query q = DatabaseAccess.getInstance().createQuery(
			"FROM db.Drinkki_Ainesosa as drinkki_ainesosa WHERE " +
			"drinkki_ainesosa.drinkki = :drinkki AND " +
			"drinkki_ainesosa.ainesosa = :ainesosa"
			);

		q.setParameter("drinkki", this);
		q.setParameter("ainesosa", ainesosa);

		return (q.list().size() == 0) ? false : true;
	}

	/**
	 * get all the ingredients of this COCKtail.
	 * @return ingredients
	 */
	public List<Ainesosa> getAinesosat() {
		Query q = DatabaseAccess.getInstance().createQuery(
			"FROM db.Drinkki_Ainesosa as drinkki_ainesosa WHERE " +
			"drinkki_ainesosa.drinkki = :drinkki"
			);

		q.setParameter("drinkki", this);

		List<Ainesosa> ainesosat = new ArrayList<Ainesosa>();

		for (Drinkki_Ainesosa drinkki_ainesosa
			: (List<Drinkki_Ainesosa>)q.list()) {
				ainesosat.add(drinkki_ainesosa.getAinesosa());
		}

		return ainesosat;
	}

	/**
	 * @return all the aliases for this drink.
	 */
	public List<Nimi> getNimet() {
		Query q = DatabaseAccess.getInstance().createQuery(
			"FROM db.Nimi as drinkki_nimi WHERE " +
			"drinkki_nimi.drinkki = :drinkki"
                        );

		q.setParameter("drinkki", this);

		return q.list();
	}

	/**
	 * @return the single most important name for this drink.
	 */
	public String getTehNimi() {
		List<Nimi> nimet = getNimet();

		int value = -1;
		String nimi = "";

		for (Nimi n : nimet) {
			if (n.getYleisyys() > value) {
				nimi = n.getNimi();
				value = n.getYleisyys();
			}
		}

		return nimi;
	}

	public int compareTo(Object o) {
		if (o instanceof Drinkki) {
			Drinkki other = (Drinkki) o;
			if (other.getId() > id) {
				return 1;
			} else if (other.getId() == id) {
				return 0;
			} else {
				return -1;
			}
		} else {
			throw new ClassCastException("Unable to compare");
		}
	}

}
